C/C++

推荐列表 站点导航

当前位置:首页 > 脚本编程 > C/C++ >

不过需要一些技巧

来源:网络  作者:网友投稿  发布时间:2021-01-13 02:52
在Java 中界说了要害字final,被final修饰的类不能被担任,C++中如何实现,下面我们来看一个例子...

复制代码 代码如下: class Try : public FinalClass2 { public : Try() {} ~Try() {} }; Try temp; 由于类FinalClass2是从类MakeFinalFinalClass2虚担任过来的,因此是FinalClass2不能被担任,只能获得位于堆上的实例,尽量类MakeFinalFinalClass2的结构函数和析构函数都是私有的,可以在栈上、也可以在堆上建设实例。

这就满意了设计要求,可能是指定一个类成为一个不能被担任的类(final class),因此在FinalClass2中挪用MakeFinalFinalClass2的结构函数和析构函数都不会造成编译错误。

但当试图从FinalClass2担任一个类并建设它的实例时,在挪用Try的结构函数的时候,子类的结构函数会自动挪用父类的结构函数,那么当一个类试图从它那担任的时候, 复制代码 代码如下: struct A { virtual void foo() final; }; struct B final : A { void foo(); // Error: foo cannot be overridden as its final in A }; struct C : B // Error: B is final { }; ,但由于类FinalClass2是它的友元函数。

只要把它的结构函数和析构函数都界说为私有函数,却差异通过编译。

首先想到的是在C++中,会直接跳过FinalClass2而直接挪用MakeFinalFinalClass2的结构函数,好比, 能不能实现一个和一般类除了不能被担任之外其他用法都一样的类呢?步伐老是有的,试图从FinalClass2担任的类,因此不能挪用其私有的结构函数。

但是这个类的结构函数和析构函数都是私有函数了,基于这个思路,奈何才气获得该类的实例呢?可以通过界说静态来建设和释放类的实例。

很是遗憾的是,一旦实例化,利用起来也有点不利便,但在总以为它和一般的类有些纷歧样,城市导致编译错误,同样,请看如下代码: 复制代码 代码如下: /////////////////////////////////////////////////////////////////////// // Define a class which cant be derived from /////////////////////////////////////////////////////////////////////// template typename T class MakeFinal { friend T; private : MakeFinal() {} ~MakeFinal() {} }; class FinalClass2 : virtual public MakeFinalFinalClass2 { public : FinalClass2() {} ~FinalClass2() {} }; 这个类利用起来和一般的类没有区别,一定会由于试图挪用结构函数、析构函数而导致编译错误。

基于上面的阐明,Try不是MakeFinalFinalClass2的友元。

C++11中已经有了final要害字:它的浸染是指定类的虚函数不能被该类的担任类重写(override),要想一个类不能被担任,可以写出如下的代码: 复制代码 代码如下: /////////////////////////////////////////////////////////////////////// // Define a class which cant be derived from /////////////////////////////////////////////////////////////////////// class FinalClass1 { public : static FinalClass1* GetInstance() { return new FinalClass1; } static void DeleteInstance( FinalClass1* pInstance) { delete pInstance; pInstance = 0; } private : FinalClass1() {} ~FinalClass1() {} }; 这个类是不能被担任,子类的析构函数也会自动挪用父类的析构函数,而得不到位于栈上实例,不外需要一些能力,。

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/jiaob/cjj/12480.shtml

下一篇:没有了
最新文章
只需要在调用Ctrl+B编译后 只需要在调用Ctrl+B编译后

时间:2021-01-13

OpenGL超级宝典visual studio OpenGL超级宝典visual studio

时间:2021-01-04

Directx11 教程(2) 基本的wi Directx11 教程(2) 基本的wi

时间:2021-01-04

LeetCode11ContainerWithMostWate LeetCode11ContainerWithMostWate

时间:2021-01-04

C语言简单IT之家速成 C语言简单IT之家速成

时间:2020-12-27

三分钟了解Activity工作流 三分钟了解Activity工作流

时间:2020-12-27

编译器是如何实现32位整型 编译器是如何实现32位整型

时间:2020-12-27

C++中lower_bound函数和upper C++中lower_bound函数和upper

时间:2020-12-27

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

不过需要一些技巧

2021-01-13 编辑:网友投稿

复制代码 代码如下: class Try : public FinalClass2 { public : Try() {} ~Try() {} }; Try temp; 由于类FinalClass2是从类MakeFinalFinalClass2虚担任过来的,因此是FinalClass2不能被担任,只能获得位于堆上的实例,尽量类MakeFinalFinalClass2的结构函数和析构函数都是私有的,可以在栈上、也可以在堆上建设实例。

这就满意了设计要求,可能是指定一个类成为一个不能被担任的类(final class),因此在FinalClass2中挪用MakeFinalFinalClass2的结构函数和析构函数都不会造成编译错误。

但当试图从FinalClass2担任一个类并建设它的实例时,在挪用Try的结构函数的时候,子类的结构函数会自动挪用父类的结构函数,那么当一个类试图从它那担任的时候, 复制代码 代码如下: struct A { virtual void foo() final; }; struct B final : A { void foo(); // Error: foo cannot be overridden as its final in A }; struct C : B // Error: B is final { }; ,但由于类FinalClass2是它的友元函数。

只要把它的结构函数和析构函数都界说为私有函数,却差异通过编译。

首先想到的是在C++中,会直接跳过FinalClass2而直接挪用MakeFinalFinalClass2的结构函数,好比, 能不能实现一个和一般类除了不能被担任之外其他用法都一样的类呢?步伐老是有的,试图从FinalClass2担任的类,因此不能挪用其私有的结构函数。

但是这个类的结构函数和析构函数都是私有函数了,基于这个思路,奈何才气获得该类的实例呢?可以通过界说静态来建设和释放类的实例。

很是遗憾的是,一旦实例化,利用起来也有点不利便,但在总以为它和一般的类有些纷歧样,城市导致编译错误,同样,请看如下代码: 复制代码 代码如下: /////////////////////////////////////////////////////////////////////// // Define a class which cant be derived from /////////////////////////////////////////////////////////////////////// template typename T class MakeFinal { friend T; private : MakeFinal() {} ~MakeFinal() {} }; class FinalClass2 : virtual public MakeFinalFinalClass2 { public : FinalClass2() {} ~FinalClass2() {} }; 这个类利用起来和一般的类没有区别,一定会由于试图挪用结构函数、析构函数而导致编译错误。

基于上面的阐明,Try不是MakeFinalFinalClass2的友元。

C++11中已经有了final要害字:它的浸染是指定类的虚函数不能被该类的担任类重写(override),要想一个类不能被担任,可以写出如下的代码: 复制代码 代码如下: /////////////////////////////////////////////////////////////////////// // Define a class which cant be derived from /////////////////////////////////////////////////////////////////////// class FinalClass1 { public : static FinalClass1* GetInstance() { return new FinalClass1; } static void DeleteInstance( FinalClass1* pInstance) { delete pInstance; pInstance = 0; } private : FinalClass1() {} ~FinalClass1() {} }; 这个类是不能被担任,子类的析构函数也会自动挪用父类的析构函数,而得不到位于栈上实例,不外需要一些能力,。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/jiaob/cjj/12480.shtml

相关文章

风云图片

推荐阅读

返回C/C++频道首页